// GlobalVar.js - 全局变量与模块管理（适配Hiker框架）
const GlobalVar = {
  // 1. 全局变量存储池（内存级，页面刷新后重置）
  _memoryVars: {},

  // 2. 模块缓存池（避免重复加载外部JS）
  _moduleCache: {},

  /**
   * 【内存变量】设置全局变量
   * @param {string} key - 变量名
   * @param {any} value - 变量值
   */
  setMemoryVar(key, value) {
    this._memoryVars[key] = value;
  },

  /**
   * 【内存变量】获取全局变量
   * @param {string} key - 变量名
   * @param {any} defaultValue - 默认值（变量不存在时返回）
   * @returns {any} 变量值或默认值
   */
  getMemoryVar(key, defaultValue = null) {
    return this._memoryVars.hasOwnProperty(key) ? this._memoryVars[key] : defaultValue;
  },

  /**
   * 【内存变量】删除全局变量
   * @param {string} key - 变量名
   */
  removeMemoryVar(key) {
    delete this._memoryVars[key];
  },

  /**
   * 【持久化变量】设置本地存储（基于Hiker框架的setItem，页面刷新后保留）
   * @param {string} key - 存储键
   * @param {any} value - 存储值（自动转为字符串）
   */
  setPersistentVar(key, value) {
    if (typeof setItem !== 'undefined') { // 兼容Hiker框架环境
      setItem(key, typeof value === 'object' ? JSON.stringify(value) : String(value));
    } else {
      console.warn('Hiker框架setItem未找到，已降级为localStorage');
      localStorage.setItem(key, typeof value === 'object' ? JSON.stringify(value) : String(value));
    }
  },

  /**
   * 【持久化变量】获取本地存储（基于Hiker框架的getItem）
   * @param {string} key - 存储键
   * @param {any} defaultValue - 默认值
   * @returns {any} 存储值（自动解析JSON）或默认值
   */
  getPersistentVar(key, defaultValue = null) {
    let value;
    if (typeof getItem !== 'undefined') { // 兼容Hiker框架环境
      value = getItem(key);
    } else {
      console.warn('Hiker框架getItem未找到，已降级为localStorage');
      value = localStorage.getItem(key);
    }

    // 尝试解析JSON（处理对象/数组类型存储）
    if (value === null || value === undefined) return defaultValue;
    try {
      return JSON.parse(value);
    } catch (e) {
      return value; // 非JSON格式直接返回字符串
    }
  },

  /**
   * 【持久化变量】删除本地存储
   * @param {string} key - 存储键
   */
  removePersistentVar(key) {
    if (typeof clearItem !== 'undefined') { // 兼容Hiker框架环境
      clearItem(key);
    } else {
      console.warn('Hiker框架clearItem未找到，已降级为localStorage');
      localStorage.removeItem(key);
    }
  },

  /**
   * 【模块加载】加载外部JS模块并缓存（核心适配jdbf.js）
   * @param {string} moduleKey - 模块唯一标识（如"audioSingle"）
   * @param {string} jsUrl - 外部JS文件地址（如jdbf.js的URL）
   * @returns {Promise<any>} 模块实例（缓存优先）
   */
  moduleMyVar(moduleKey, jsUrl) {
    // 1. 先查缓存，避免重复加载
    if (this._moduleCache[moduleKey]) {
      return Promise.resolve(this._moduleCache[moduleKey]);
    }

    // 2. 缓存不存在，动态加载JS
    return new Promise((resolve, reject) => {
      const script = document.createElement('script');
      script.src = jsUrl;
      script.type = 'text/javascript';
      script.async = true;

      // 加载成功：获取模块并缓存
      script.onload = () => {
        // 适配jdbf.js的导出逻辑（window全局或module.exports）
        const moduleInstance = window[moduleKey] || (typeof module !== 'undefined' && module.exports);
        if (moduleInstance) {
          this._moduleCache[moduleKey] = moduleInstance;
          resolve(moduleInstance);
        } else {
          reject(new Error(`模块${moduleKey}加载成功，但未找到导出实例`));
        }
      };

      // 加载失败
      script.onerror = () => {
        reject(new Error(`模块${moduleKey}加载失败，URL: ${jsUrl}`));
      };

      // 插入DOM开始加载
      document.head.appendChild(script);
    });
  },

  /**
   * 【模块管理】清除指定模块缓存
   * @param {string} moduleKey - 模块唯一标识
   */
  clearModuleCache(moduleKey) {
    delete this._moduleCache[moduleKey];
  }
};

// 3. 暴露全局接口（适配Hiker框架调用习惯）
if (typeof window !== 'undefined') {
  window.GlobalVar = GlobalVar;
  // 简化调用别名（与前文代码中的G.moduleMyVar对应）
  window.G = GlobalVar;
}

// 4. 模块导出（支持CommonJS环境）
if (typeof module !== 'undefined' && module.exports) {
  module.exports = GlobalVar;
}
